構造的型付けと serialize 境界 | TSKaigi Kansai
スピーカー
恩田 崇
株式会社一休 CTO室
どんな問題が起きていたのか
最終的にserializeするまでの過程で、データの前処理や変換を伴うにも関わらず、変換前の型が構造的部分型を満たしてしまい、必要な変換が漏れてしまう
2006年にサービスを開始している
後方互換性の維持
1度世に出たURLは生き続ける
要因
URLのパターンに応じた複数の検索条件型
検索条件は省略可能なフィールドが多い
構造的部分型を満たしてしまってバグが埋め込まれる
解決策
基本的な方法
シリアライズ直前で安全な値に変換する
code:ts
const params = { keyword: data.keyword }
const q = new URLSearchParams(params)
バリデータライブラリを使う
zodやvalibotのparse処理を挟む
構造的部分型を満たしてそのまま渡せちゃう問題は解決しない
構造的部分型と公称型
型の互換性=代入できる、パラメータとして渡せる
nominal typing
java, c, rust, swif
structual subtyping
ts, go, scala
nominal typing
継承で型の互換性を明示的に定義する
code:java
class A {
String name;
}
class B extends A {
String address;
}
class A2 {
String name;
}
A b = new B(); // OK
A a2 = new A2(); // error
structual subtyping
型が同じsignatureなら互換性を持つ
TypeScriptで公称型を使えないか
class
branded types
zodやvalibot
.brandで使える